三國演義小說的文字檔,很容易在網路上取得。先複製貼上第一回到你習慣的文字編輯器中,先將斷行符號移除,讓整個第一回變成一行(Line)。
如果你和我一樣也是使用 Visual Studio Code 可以啟用正規表達式,將"\n"取代為空白即可。
今天要做的事情,很單純,就是上傳三國演義第一回,本來想要上傳整本合計 120回;但因為遇到諸多問題,請容我後續再整部上傳吧。
今天實作是參考 elastic co 部落格 https://www.elastic.co/blog/how-to-search-ch-jp-kr-part-2 。但最終變成了踩雷之旅。
裡面提到的 PUT mappings,由於7.0版之後的API變動了,所以無法再使用了。請參見最新的文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
這是今天遇到的第一個狀況。
總之,我們先不管那麼多,先把第一回直接用 POST 丟上去吧:
PUT Three_Kingdoms/docs/1
{
"body" :"第一回..."
}
啊~這是我自己的過錯,index的命名只接受小寫
再試一次,果然成功囉!
我們可以試著蒐尋看看,第一回張飛是不是已經登場了
POST three_kingdoms/docs/_count
{
"query": {
"multi_match": {
"query": "張飛",
"fields": [
"body"
]
}
}
}
是的,張飛第一回就登場囉
再看看張飛與董卓是否也一起登場了
POST three_kingdoms/docs/_count
{
"query": {
"multi_match": {
"query": "張飛 董卓",
"fields": [
"body"
]
}
}
}
再看看趙雲是不是也登場了
POST three_kingdoms/docs/_count
{
"query": {
"multi_match": {
"query": "趙雲
"fields": [
"body"
]
}
}
}
咦不對啊!!!
為什麼趙雲會在第一回就出場了
試了一下,原來是因為我沒有合理的設定蒐尋條件。
對於 ElasticSearch 來說,它認為只要 "趙" 或 "雲"其中有一個條件成立就計算為1筆。
新增 "operator": "and", "minimum_should_match": 2 的篩選條件,總算不再出現趙雲囉
POST three_kingdoms/docs/_count
{
"query": {
"multi_match": {
"operator": "and",
"minimum_should_match": 2,
"query": "趙雲",
"fields": [
"body"
]
}
}
}
或是改用正規表達式,也可以!
POST three_kingdoms/docs/_count
{
"query": {
"regexp": {
"body": "趙雲"
}
}
}
光是從三國演義第一回的範例中,就可以看出 ElasticSearch 與一般資料庫相比,在字串蒐尋上的強大。
但也因為它的強大,所以會讓初學者的我一再的撞牆。也可以發現新舊版的API的差異,因為 ElasticSearch的更新非常的快速,所以就連官網2018年的部落格文章中的 PUT mapping 也無法直接延用,請直接參考官方的API文件進行閱讀。
總之,接下來的日子,讓我好好的慢慢與 API 文件更熟悉些吧!